<html>
<head id="Head1" runat="server">
    <title>Google Translation</title>
    <meta charset="UTF-8">
    <style>
        .goog-te-banner-frame.skiptranslate {
            display: none !important;
        }

        body {
            top: 0px !important;
        }

        .goog-logo-link {
            display: none !important;
        }

        .trans-section {
            margin: 100px;
        }

        .skiptranslate {
            display: none !important;
        }
    </style>
</head>
<body>

<div class="trans-section">
    <span title="语言" style="border-right:0;">
        <div id="google_translate_element" style="display: none;"></div>
        <button onclick="loadScript()">载入翻译脚本</button>
        <button onclick="refresh()">翻译</button>
        <button onclick="cancelTrans()">取消翻译</button>
        <select id="translateSelect" style="color: #888;width: 95px;" onchange="switchLang(this.value);">
            <option value="中文（简体）">中文</option>
            <option value="中文（繁体）">繁體</option>
            <option value="英语">English</option>
            <option value="韩语">한국어</option>
            <option value="日语">日本語</option>
        </select>
    </span>
    <div>
        <p>
            <span style="color: inherit; font-family: &quot;Source Sans Pro&quot;, sans-serif; font-size: 20px;">数据库基础与理论</span>
        </p>
        <div>
            <p>
                <em>相关文章</em>
            </p>
            <blockquote>
                <p>
                    <strong>A. 了解数据库基础和理论知识</strong>：在学习数据库之前，不要一上来就是SQL语句；这里建议从数据结构开始切入到数据库，然后再理解数据库是如何工作的，紧接着理解数据库系统的原理知识点和相关知识体系。
                </p>
            </blockquote>
            <ul>
                <li>
                    <a href="/md/db/sql/sql-db.html" class="router-link-exact-active router-link-active">SQL DB -
                        资料汇总</a>
                </li>
                <li>
                    <a href="/md/db/sql/sql-db-howitworks.html" class="">SQL DB - 关系型数据库是如何工作的</a>
                    <ul>
                        <li>
                            很多人在学习数据库时都是孤立的学习知识点，这样是很难将所有知识点串起来深入理解；强烈推荐你学习两篇文章：<a
                                href="https://dsf.berkeley.edu/papers/fntdb07-architecture.pdf" target="_blank">Architecture
                            of a Database System
                            <svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" class="icon outbound"></svg>
                            <span class="sr-only">(opens new window)</span></a>以及<a
                                href="http://coding-geek.com/how-databases-work" target="_blank">How does a relational
                            database work
                            <svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" class="icon outbound"></svg>
                            <span class="sr-only">(opens new window)</span></a>；本文主要在第二篇基础上翻译并梳理，如果你英文不好的话，你可以通过本文帮助你构筑数据库体系的基础
                        </li>
                    </ul>
                </li>
                <li>
                    <a href="/md/db/sql/sql-db-theory-concept.html" class="">SQL DB - 关系型数据库设计理论</a>
                    <ul>
                        <li>
                            在上文了解数据库如何工作后，本节介绍如何将一个<strong>关系模型</strong>（基于表的数据模型）合理的转化为<strong>数据表</strong>和<strong>关系表</strong>，以及确定<strong>主外键</strong>的。这便是数据库设计理论基础，包括术语，函数依赖，范式等理论基础
                        </li>
                    </ul>
                </li>
                <li>
                    <a href="/md/db/sql/sql-db-theory-design.html" class="">SQL DB - 关系型数据库设计流程</a>
                    <ul>
                        <li>
                            在上文知道如何设计表和健后，让我们再看看整个的<strong>数据库设计的标准流程</strong>吧，主要包括<code>需求分析</code>,
                            <code>概念结构设计</code>, <code>逻辑结构设计</code> , <code>物理设计</code>,
                            <code>实施阶段</code>和<code>运行和维护阶段</code>这6个阶段
                        </li>
                    </ul>
                </li>
                <li>
                    <a href="/md/db/sql/sql-db-theory.html" class="">SQL DB - 数据库系统核心知识点</a>
                    <ul>
                        <li>
                            基于上篇数据库如何工作的基础之上，我们再来梳理下数据库系统中有哪些重要的知识点，包括：事务，并发一致性，封锁，隔离级别，多版本并
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
        <p>
            <br/>
        </p>
    </div>
</div>
</body>
<script>
    window.googleScriptLoadOk = false;
    window.translateElement = {}

    /**
     * 初始化谷歌翻译
     */
    function googleInit() {
        console.log("初始化")
        try {
            window.translateElement = new google.translate.TranslateElement({
                includedLanguages: 'en,zh-CN,zh-TW,ko,ja',
                pageLanguage: "zh-CN",
                layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
                autoDisplay: false
            }, 'google_translate_element');
        } catch (e) {
            console.log("初始化失败。重试")
            setTimeout(googleInit, 100)
        }
    }

    /**
     * 加载谷歌翻译脚本
     */
    function loadScript() {
        // 创建一个计时器
        let timeout = setTimeout(function () {
            // 在超时后执行的代码
            console.log('当前网络环境不支持国际化!')
            alert("当前网络环境不支持国际化!")
        }, 2000); // 设置超时时间为5秒

        // 加载外部JavaScript文件
        let script = document.createElement('script');
        script.src = 'https://translate.google.com/translate_a/element.js';
        script.onload = function () {
            clearTimeout(timeout);
            window.googleScriptLoadOk = true
            googleInit()
        };
        script.onerror = function () {
            clearTimeout(timeout);
        };
        document.body.appendChild(script);
    }

    loadScript()
</script>
<script type="text/javascript">

    /**
     * 获取支持的语言
     * @returns {{ko: string, "zh-TW": string, ja: string, en: string, "zh-CN": string}}
     */
    function getLangs() {
        return {
            "zh-CN": "中文（简体）",
            "zh-TW": "中文（繁体）",
            "en": "英语",
            "ko": "韩语",
            "ja": "日语",
        }
    }

    /**
     * 切换语言
     * @param lang 语言
     * @returns {boolean}
     */
    function switchLang(lang) {
        if (!window.googleScriptLoadOk) {
            return false
        }
        if (lang === getLangs()['zh-CN']) {
            cancelTrans()
            return false
        }
        let iframeEle = document.querySelector("body > iframe")
        if (!iframeEle) {
            console.log("未初始化，切换失败:" + lang)
            return false;
        }
        let allSpan = document.querySelector("body > iframe").contentDocument.querySelectorAll('.VIpgJd-ZVi9od-vH1Gmf-ibnC6b span')
        if (allSpan.length === 0) {
            console.log("元素不存在，切换失败:" + lang)
            return false
        }
        for (let allSpanEle of allSpan) {
            if (allSpanEle.innerText.indexOf(lang) > -1) {
                allSpanEle.click()
                console.log("切换成功:" + lang)
                return true;
            }
        }
        console.log("切换失败:" + lang)
        return false;
    }

    /**
     * 取消翻译
     */
    function cancelTrans() {
        if (!window.googleScriptLoadOk) {
            return
        }
        console.log('取消翻译')
        let doc = document.querySelector(".VIpgJd-ZVi9od-ORHb-OEVmcd.skiptranslate").contentDocument
        doc.querySelector('#\\:2\\.restore').click()
    }

    /**
     * 刷新翻译
     */
    function refresh() {
        if (!window.googleScriptLoadOk) {
            return
        }
        console.log('刷新')
        let doc = document.querySelector(".VIpgJd-ZVi9od-ORHb-OEVmcd.skiptranslate").contentDocument
        doc.querySelector('#\\:2\\.confirm').click()

    }

    /**
     * 等待所有Promise加载完成后执行
     */
    function toTrans(callBack, ...args) {
        Promise.all(args).finally(() => callBack())
    }
</script>
</html>